package com.dcstudy.redis.controller.jhs;

/**
 * @author lichenyang
 * @create 2021-05-25 11:13 上午
 */

import com.dcstudy.redis.entities.jhs.Constants;
import com.dcstudy.redis.entities.jhs.Product;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

/**
 * 聚划算正确版, 使用2个缓存key
 */
@RestController
@Slf4j
@Api("聚划算商品列表接口 AB")
public class JHSABProductController {
    @Resource
    private RedisTemplate<String, Product> redisTemplate;

    @RequestMapping(value = "/pruduct/findab", method = RequestMethod.GET)
    @ApiOperation(" 按照分页和每页显示容量，点击查看 AB")
    public List<Product> findAB(int page, int size) {
        List<Product> list = null;
        long start = (long) (page - 1) * size;
        long end = start + size - 1;
        try {
            // 采用 redis list 数据结构的 lrange 命令实现分页查询
            list = this.redisTemplate.opsForList().range(Constants.JHS_KEY_A, start, end);
            if (CollectionUtils.isEmpty(list)) {
                log.info("=========A 缓存已经失效了，记得人工修补， B 缓存自动延续 5 天 ");
                // 用户先查询缓存 A( 上面的代码 ) ，如果缓存 A 查询不到（例如，更新缓存的时候删除了），再查询缓存 B
                this.redisTemplate.opsForList().range(Constants.JHS_KEY_B, start, end);
            }
            log.info(" 查询结果： {}", list);
        } catch (Exception ex) {
            // 这里的异常，一般是 redis 瘫痪 ，或 redis 网络 timeout
            log.error("exception:", ex);
            // TODO 走 DB 查询
        }
        return list;
    }
}